/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.agi.myhome.servicos;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Renato
 */
public abstract class ManipuladorEntidadeAbs<T> implements ManipuladorEntidade<T> {
    @PersistenceContext
    protected EntityManager em;
    
    @Override
    public void cadastrar(T entidade) throws RegistroDuplicadoException{
        boolean duplicado;
        T registro;
        registro=em.find(getType(),getId(entidade));
        duplicado=(registro!=null);
        if(duplicado){
            throw new RegistroDuplicadoException();
        }
        em.merge(entidade);
        em.persist(entidade); 
    }
    
    @Override
    public List<T> getListaEntidade(){
        ListadorEntidade<T> listador;
        listador=new ListadorEntidade<T>().comEntityManager(em);
        return listador.getLista(this.getType());        
    }
    
    @Override
    public void salvar(T entidade){
        em.merge(entidade);
        em.flush();
    }
    
    @Override
    public T getEntidade(T entidade){
        Object id;
        T retorno;
        id=getId(entidade);
        retorno=em.find(getType(), id);
        return retorno;
    }
    
    protected void setEntityManager(EntityManager em){
        this.em=em;
    }
    
    protected abstract Class <T> getType();
    protected abstract Object getId(T entidade);
}
